package com.itheima.security.distributed.order.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;

/**
 * @author Administrator
 * @version 1.0
 **/
@Configuration
@EnableResourceServer//标记本服务为资源服务
public class ResouceServerConfig extends ResourceServerConfigurerAdapter {


    public static final String RESOURCE_ID = "res1";

    @Autowired
    TokenStore tokenStore;

    /**
     * 配置令牌访问权限
     * @param resources
     */
    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId(RESOURCE_ID)//资源 id
                .tokenStore(tokenStore)//指定令牌如何访问，与tokenServices配置可选,让本资源服务通过tokenConfig中定义的密钥来自主校验令牌是否合法
//                .tokenServices(tokenService())//验证令牌的服务
                .stateless(true);
    }

    /**
     * 配置令牌访问规则
     * @param http
     * @throws Exception
     */
    @Override
    public void configure(HttpSecurity http) throws Exception {

        http
                .authorizeRequests()

                .antMatchers("/**")//匹配所有请求路径
                    .access("#oauth2.hasScope('ROLE_ADMIN')")//确保所有请求 (/**) 都需要通过 OAuth2 的令牌验证。仅允许拥有 ROLE_ADMIN 角色(范围)的用户访问这些资源,
                // 请求的角色在认证服务的AuthorizationServer中的看客户端详情服务configure中的scopes字段定义

                .and().csrf().disable()//禁用csrf
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);//禁用session
    }

    //资源服务令牌解析服务(验证令牌服务,不用jwt时客户端会携带token来找资源服务,然后我们资源服务还要拿着这个token去找认证服务校验token)
 /*   @Bean
    public ResourceServerTokenServices tokenService() {
        //使用远程服务请求授权服务器校验token,必须指定校验token 的url、client_id，client_secret
        RemoteTokenServices service=new RemoteTokenServices();
        service.setCheckTokenEndpointUrl("http://localhost:53020/uaa/oauth/check_token");//这里是授权服务器的验证地址
        //具体在认证服务的AuthorizationServer中令牌令牌端点的安全约束配置configure中.checkTokenAccess("permitAll()")定义
        //在认证服务中，这个地址是/oauth/check_token,且被开放,使得资源服务可以通过这个url范文在授权服务的令牌解析服务完成令牌解析
        service.setClientId("c1");
        service.setClientSecret("secret");
        return service;
    }*/

}
